import numpy as np

#逻辑与数据
samples_and = [
    [0,0,0],
    [1,0,0],
    [0,1,0],
    [1,1,1],
]

#逻辑或数据
samples_or = [
    [0,0,0],
    [1,0,1],
    [0,1,1],
    [1,1,1],
]

#逻辑异或数据
samples_xor = [
    [0,0,0],
    [1,0,1],
    [0,1,1],
    [1,1,0],
]

def perceptron(samples):
    w = np.array([1,2])
    b = 0
    a = 1

    for i in range(10):
        for j in range(4):
            x = np.array(samples[j][:2])
            y = 1 if np.dot(w, x) + b > 0 else 0
            d = np.array(samples[j][2])

            delta_b = a*(d-y)
            delta_w = a*(d-y)*x

            print('epoch {} sample {} [{} {} {} {} {} {} {}]'.format(i,j,w[0],w[1],b,y,delta_w[0],delta_w[1],delta_b))
            w = w + delta_w
            b = b + delta_b

if __name__ == '__main__':
    print('logical and')
    perceptron(samples_and)
    print('logical or')
    perceptron(samples_or)
    print('logical xor')
    perceptron(samples_xor)